package org.Yiran.timetale_re.weather.manager;

import net.minecraft.server.level.ServerLevel;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.Yiran.timetale_re.Timetale_re;
import org.Yiran.timetale_re.weather.StormWeatherData;

import java.util.Random;

/**
 * 大风天气管理器
 * <p>
 * 负责管理和触发游戏中的随机大风天气事件，根据权重系统生成不同等级的风力，
 * 并可能伴随暴雨或雷电等天气现象。
 * </p>
 *
 * @author Yiran
 * @version 1.0
 */
@Mod.EventBusSubscriber(modid = Timetale_re.MODID)
public class WindyWeatherManager {
    
    // ================================
    // 常量和静态变量定义
    // ================================
    
    /**
     * 随机数生成器
     */
    private static final Random random = new Random();
    
    /**
     * 上次检查天气的时间点
     */
    private static long lastWeatherCheck = 0;

    // ================================
    // 事件处理方法
    // ================================
    
    /**
     * 世界Tick事件处理方法
     * <p>
     * 在每个世界tick结束时检查是否需要触发随机大风天气，
     * 控制检查频率以避免性能问题
     * </p>
     *
     * @param event 世界tick事件对象
     */
    @SubscribeEvent
    public static void onWorldTick(TickEvent.LevelTickEvent event) {
        if (event.phase == TickEvent.Phase.END && !event.level.isClientSide() && event.level instanceof ServerLevel serverLevel) {
            long currentTime = serverLevel.getGameTime();

            // 每30秒检查一次天气（600 ticks）
            if (currentTime - lastWeatherCheck >= 600) {
                lastWeatherCheck = currentTime;
                checkAndTriggerRandomWeather(serverLevel);
            }
        }
    }

    // ================================
    // 天气检查和触发方法
    // ================================
    
    /**
     * 检查并触发随机天气
     * <p>
     * 检查当前是否没有天气事件正在进行，如果满足条件则根据概率触发大风天气
     * </p>
     *
     * @param level 服务器世界对象
     */
    private static void checkAndTriggerRandomWeather(ServerLevel level) {
        StormWeatherData weatherData = StormWeatherData.get(level);
        long currentTime = level.getGameTime();

        // 如果当前没有天气事件在进行
        if ((!weatherData.isWindy() || currentTime >= weatherData.getStormEndTime()) &&
            (!weatherData.isStormy() || currentTime >= weatherData.getStormEndTime())) {

            // 基础触发概率为10%
            int triggerChance = 10;

            // 如果当前正在下雨，增加大风天气触发概率
            if (level.isRaining()) {
                triggerChance += 15; // 增加15%概率

                // 如果正在打雷，进一步增加概率
                if (level.isThundering()) {
                    triggerChance += 20; // 再增加20%概率
                }
            }

            // 根据概率触发大风天气
            if (random.nextInt(100) < triggerChance) {
                triggerRandomWindyWeather(level);
            }
        }
    }

    /**
     * 触发随机大风天气
     * <p>
     * 根据权重生成风力等级，设置持续时间，并可能伴随暴雨或雷电天气
     * </p>
     *
     * @param level 服务器世界对象
     */
    private static void triggerRandomWindyWeather(ServerLevel level) {
        StormWeatherData weatherData = StormWeatherData.get(level);

        // 根据权重生成1-9级风力 (等级越高越稀有)
        int windLevel = getRandomWindLevelByRarity();
        float intensity = (float) windLevel; // 强度与等级相同

        // 持续时间根据风力等级调整，等级越高持续时间越长 (5-20分钟)
        int duration = 6000 + (windLevel * 1500);

        weatherData.setWindy(true);
        weatherData.setWindLevelWithIntensity(windLevel);
        weatherData.setWindIntensity(intensity);
        weatherData.setStormStartTime(level.getGameTime());
        weatherData.setStormDuration(duration);

        // 根据风力等级决定是否伴随暴雨
        if (windLevel >= 6) { // 6级以上伴随暴雨
            weatherData.setStormy(true);
            level.setWeatherParameters(0, duration, true, false);

            // 8级以上伴随雷电
            if (windLevel >= 8) {
                level.setWeatherParameters(0, duration, true, true);
            }
        }
    }

    // ================================
    // 风力等级生成方法
    // ================================
    
    /**
     * 根据稀有度权重生成风力等级
     * <p>
     * 使用权重系统确定风力等级，等级越高，生成概率越低。
     * 等级1-9的权重分别为: 25, 20, 15, 12, 10, 8, 5, 3, 2
     * </p>
     *
     * @return 1-9级风力等级
     */
    public static int getRandomWindLevelByRarity() {
        // 使用权重系统确定风力等级
        // 等级1-9的权重分别为: 25, 20, 15, 12, 10, 8, 5, 3, 2
        int[] weights = {25, 20, 15, 12, 10, 8, 5, 3, 2};
        int totalWeight = 100; // 权重总和

        int randomValue = random.nextInt(totalWeight);
        int cumulativeWeight = 0;

        for (int i = 0; i < weights.length; i++) {
            cumulativeWeight += weights[i];
            if (randomValue < cumulativeWeight) {
                return i + 1; // 返回等级 (1-9)
            }
        }

        // 默认返回1级风
        return 1;
    }
}